Micron Document
| SparkN0de-git | SparkN0de |


Displaying Raw • Download


RNS/Reticulum.py be36abd85715afd9dd7dccdda29d024d3d0f2353 (be36abd8) Text, 94.79 KB

T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72from T7ee787.T7ee787vendorT7ee787.T7ee787platformutils Tff7b72import Te6edf3get_platform

Tff7b72if Te6edf3get_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3Interface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3LocalInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3AutoInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3BackboneInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3TCPInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3UDPInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3I2PInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3RNodeMultiInterface
Tff7b72from T7ee787.T7ee787Interfaces Tff7b72import Te6edf3WeaveInterface
Tff7b72from T7ee787.T7ee787InterfacesT7ee787.T7ee787Android Tff7b72import Te6edf3RNodeInterface
Tff7b72from T7ee787.T7ee787InterfacesT7ee787.T7ee787Android Tff7b72import Te6edf3SerialInterface
Tff7b72from T7ee787.T7ee787InterfacesT7ee787.T7ee787Android Tff7b72import Te6edf3KISSInterface
Tff7b72elseTb4b4b4:
Tff7b72from T7ee787RNST7ee787.T7ee787Interfaces Tff7b72import Tff7b72*

Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787mp
Tff7b72import T7ee787configparser
Tff7b72import T7ee787multiprocessingT7ee787.T7ee787connection
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72import T7ee787threading
Tff7b72import T7ee787signal
Tff7b72import T7ee787atexit
Tff7b72import T7ee787struct
Tff7b72import T7ee787array
Tff7b72import T7ee787time
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS

Tff7b72class T56d364ReticulumTb4b4b4:
T8b949e"""
This class is used to initialise access to Reticulum within a
program. You must create exactly one instance of this class before
carrying out any other RNS operations, such as creating destinations
or sending traffic. Every independently executed program must create
their own instance of the Reticulum class, but Reticulum will
automatically handle inter-program communication on the same system,
and expose all connected programs to external interfaces as well.

As soon as an instance of this class is created, Reticulum will start
opening and configuring any hardware devices specified in the supplied
configuration.

Currently the first running instance must be kept running while other
local instances are connected, as the first created instance will
act as a master instance that directly communicates with external
hardware such as modems, TNCs and radios. If a master instance is
asked to exit, it will not exit until all client processes have
terminated (unless killed forcibly).

If you are running Reticulum on a system with several different
programs that use RNS starting and terminating at different times,
it will be advantageous to run a master RNS instance as a daemon for
other programs to use on demand.
"""

T8b949e# Future minimum will probably be locked in at 251 bytes to support
T8b949e# networks with segments of different MTUs. Absolute minimum is 219.
Te6edf3MTU Tff7b72= T79c0ff500
T8b949e"""
The MTU that Reticulum adheres to, and will expect other peers to
adhere to. By default, the MTU is 500 bytes. In custom RNS network
implementations, it is possible to change this value, but doing so will
completely break compatibility with all other RNS networks. An identical
MTU is a prerequisite for peers to communicate in the same network.

Unless you really know what you are doing, the MTU should be left at
the default value.
"""

Te6edf3LINK_MTU_DISCOVERY Tff7b72= Tff7b72True
T8b949e"""
Whether automatic link MTU discovery is enabled by default. Link MTU
discovery significantly increases throughput over fast links.
"""

Te6edf3MAX_QUEUED_ANNOUNCES Tff7b72= T79c0ff16384
Te6edf3QUEUED_ANNOUNCE_LIFE Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff24

Te6edf3ANNOUNCE_CAP Tff7b72= T79c0ff2
T8b949e"""
The maximum percentage of interface bandwidth that, at any given time,
may be used to propagate announces. If an announce was scheduled for
broadcasting on an interface, but doing so would exceed the allowed
bandwidth allocation, the announce will be queued for transmission
when there is bandwidth available.

Reticulum will always prioritise propagating announces with fewer
hops, ensuring that distant, large networks with many peers on fast
links don't overwhelm the capacity of smaller networks on slower
mediums. If an announce remains queued for an extended amount of time,
it will eventually be dropped.

This value will be applied by default to all created interfaces,
but it can be configured individually on a per-interface basis. In
general, the global default setting should not be changed, and any
alterations should be made on a per-interface basis instead.
"""

Te6edf3MINIMUM_BITRATE Tff7b72= T79c0ff5
T8b949e"""
Minimum bitrate required across a medium for Reticulum to be able
to successfully establish links. Currently 5 bits per second.
"""

T8b949e# TODO: Let Reticulum somehow continously build a map of per-hop
T8b949e# latencies and use this map for global timeout calculation.
Te6edf3DEFAULT_PER_HOP_TIMEOUT Tff7b72= T79c0ff6

T8b949e# Length of truncated hashes in bits.
Te6edf3TRUNCATED_HASHLENGTH Tff7b72= T79c0ff128

Te6edf3HEADER_MINSIZE Tff7b72= T79c0ff2Tff7b72+T79c0ff1Tff7b72+Tb4b4b4(Te6edf3TRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff1
Te6edf3HEADER_MAXSIZE Tff7b72= T79c0ff2Tff7b72+T79c0ff1Tff7b72+Tb4b4b4(Te6edf3TRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Te6edf3IFAC_MIN_SIZE Tff7b72= T79c0ff1
Te6edf3IFAC_SALT Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffadf54d882c9a9b80771eb4995d702d4a3e733391b2a0f53f416d9f907e55cff8Ta5d6ff"Tb4b4b4)
Te6edf3MDU Tff7b72= Te6edf3MTU Tff7b72- Te6edf3HEADER_MAXSIZE Tff7b72- Te6edf3IFAC_MIN_SIZE

Te6edf3RESOURCE_CACHE Tff7b72= T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff5Tff7b72*T79c0ff60
Te6edf3CLEAN_INTERVAL Tff7b72= T79c0ff15Tff7b72*T79c0ff60
Te6edf3PERSIST_INTERVAL Tff7b72= T79c0ff60Tff7b72*T79c0ff60Tff7b72*T79c0ff12
Te6edf3GRACIOUS_PERSIST_INTERVAL Tff7b72= T79c0ff60Tff7b72*T79c0ff5

Te6edf3router Tff7b72= Tff7b72None
Te6edf3config Tff7b72= Tff7b72None
T8b949e# The default configuration path will be expanded to a directory
T8b949e# named ".reticulum" inside the current users home directory
Te6edf3userdir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4)
Te6edf3configdir Tff7b72= Tff7b72None
Te6edf3configpath Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3storagepath Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3cachepath Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3interfacepath Tff7b72= Ta5d6ff"Ta5d6ff"

Te6edf3gracious_persist_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)

Te6edf3__instance Tff7b72= Tff7b72None

Te6edf3__interface_detach_ran Tff7b72= Tff7b72False
Te6edf3__exit_handler_ran Tff7b72= Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# This exit handler is called whenever Reticulum is asked to
T8b949e# shut down, and will in turn call exit handlers in other
T8b949e# classes, saving necessary information to disk and carrying
T8b949e# out cleanup operations.
Tff7b72if Tff7b72not Te6edf3ReticulumTff7b72.Td2a8ff__exit_handler_ranTb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ff__exit_handler_ran Tff7b72= Tff7b72True
Tff7b72if Tff7b72not Te6edf3ReticulumTff7b72.Td2a8ff__interface_detach_ranTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffdetach_interfacesTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffProfilerTff7b72.Td2a8ffranTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffProfilerTff7b72.Td2a8ffresultsTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_NONE
Te6edf3RNSTff7b72.Td2a8ff_detach_stdoutTb4b4b4(Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffsigint_handlerTb4b4b4(Te6edf3signalTb4b4b4, Te6edf3frameTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffdetach_interfacesTb4b4b4(Tb4b4b4)
Te6edf3ReticulumTff7b72.Td2a8ff__interface_detach_ran Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8ffexitTb4b4b4(Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffsigterm_handlerTb4b4b4(Te6edf3signalTb4b4b4, Te6edf3frameTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffdetach_interfacesTb4b4b4(Tb4b4b4)
Te6edf3ReticulumTff7b72.Td2a8ff__interface_detach_ran Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8ffexitTb4b4b4(Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Return the currently running Reticulum instance
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__instance

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4,Te6edf3configdirTff7b72=Tff7b72NoneTb4b4b4, Te6edf3loglevelTff7b72=Tff7b72NoneTb4b4b4, Te6edf3logdestTff7b72=Tff7b72NoneTb4b4b4, Te6edf3verbosityTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3require_shared_instanceTff7b72=Tff7b72FalseTb4b4b4, Te6edf3shared_instance_typeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""
Initialises and starts a Reticulum instance. This must be
done before any other operations, and Reticulum will not
pass any traffic before being instantiated.

:param configdir: Full path to a Reticulum configuration directory.
"""

Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ff__instance Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reinitialise Reticulum, when it was already runningTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__instance Tff7b72= Tff7b72self

Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffplatform_checksTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3configdir Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3configdir
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/reticulumTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/reticulum/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ffconfigdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/reticulumTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/reticulumTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/reticulum/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/reticulumTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.reticulumTa5d6ff"

Tff7b72if Te6edf3logdest Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLOG_FILETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_FILE
Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72= Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72or Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/logfileTa5d6ff"
Tff7b72elif Tffa657callableTb4b4b4(Te6edf3logdestTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_CALLBACK
Te6edf3RNSTff7b72.Td2a8fflogcall Tff7b72= Te6edf3logdest
Te6edf3ReticulumTff7b72.Td2a8ffconfigpath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffcachepath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/cacheTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffresourcepath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/resourcesTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffidentitypath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/identitiesTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffblackholepath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/blackholeTa5d6ff"
Te6edf3ReticulumTff7b72.Td2a8ffinterfacepath Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/interfacesTa5d6ff"

Te6edf3ReticulumTff7b72.Td2a8ff__network_identity Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__transport_enabled Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__static_transport_identity Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__local_hops_delta Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__link_mtu_discovery Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffLINK_MTU_DISCOVERY
Te6edf3ReticulumTff7b72.Td2a8ff__remote_management_enabled Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__use_implicit_proof Tff7b72= Tff7b72True
Te6edf3ReticulumTff7b72.Td2a8ff__allow_probes Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__discovery_enabled Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__discover_interfaces Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__autoconnect_discovered_interfaces Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__required_discovery_value Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__publish_blackhole Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_update_interval Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDiscoveryTff7b72.Td2a8ffBlackholeUpdaterTff7b72.Td2a8ffUPDATE_INTERVAL
Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_sources Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3ReticulumTff7b72.Td2a8ff__interface_sources Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_target Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_penalty Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_grace Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_max_held_announces Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_hold Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_freq_new Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_freq Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_pr_burst_freq_new Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_pr_burst_freq Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_new_time Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_penalty Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ic_held_release_interval Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__ec_pr_freq Tff7b72= Tff7b72None
Te6edf3ReticulumTff7b72.Td2a8ff__egress_control Tff7b72= Tff7b72None

Te6edf3ReticulumTff7b72.Td2a8ffpanic_on_interface_error Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8fflocal_interface_port Tff7b72= T79c0ff37428
Tff7b72selfTff7b72.Td2a8fflocal_control_port Tff7b72= T79c0ff37429
Tff7b72selfTff7b72.Td2a8fflocal_socket_path Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffshare_instance Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72= Te6edf3shared_instance_type
Tff7b72selfTff7b72.Td2a8ffrpc_listener Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrpc_key Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrpc_type Tff7b72= Ta5d6ff"Ta5d6ffAF_INETTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffuse_af_unix Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffbootstrap_configs Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72selfTff7b72.Td2a8ffifac_salt Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffIFAC_SALT

Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72= Te6edf3loglevel
Tff7b72selfTff7b72.Td2a8ffrequested_verbosity Tff7b72= Te6edf3verbosity
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72> Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4: Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREME
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72< Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4: Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICAL

Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequested_loglevel

Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffshared_instance_interface Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrequire_shared Tff7b72= Te6edf3require_shared_instance
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffis_standalone_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffjobs_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflast_data_persist Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_cache_clean Tff7b72= T79c0ff0

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffcachepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffresourcepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffresourcepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffidentitypathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffblackholepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffblackholepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffinterfacepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffinterfacepathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffcachepathTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load config file, creating default configuration file...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__create_default_configTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDefault config file created. Make any necessary changes in Ta5d6ff"Tff7b72+Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/config and restart Reticulum if needed.Ta5d6ff"Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.5Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff__apply_configTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUtilising cryptography backend Tffea00\"Tffd700{Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffProviderTff7b72.Td2a8ffbackendTb4b4b4(Tb4b4b4)Tffd700}Tffea00\"Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConfiguration loaded from Tffd700{Tff7b72selfTff7b72.Td2a8ffconfigpathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffload_known_destinationsTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_clean_ratchetsTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffuse_af_unixTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrpc_addr Tff7b72= Ta5d6fffTa5d6ff"Tffea00\0Ta5d6ffrns/Tffd700{Tff7b72selfTff7b72.Td2a8fflocal_socket_pathTffd700}Ta5d6ff/rpcTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffrpc_type Tff7b72= Ta5d6ff"Ta5d6ffAF_UNIXTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrpc_addr Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8fflocal_control_portTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrpc_type Tff7b72= Ta5d6ff"Ta5d6ffAF_INETTa5d6ff"

Tff7b72if Tff7b72selfTff7b72.Td2a8ffrpc_key Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrpc_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinternal_identityTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_shared_instanceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrpc_listener Tff7b72= Te6edf3multiprocessingTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffListenerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrpc_addrTb4b4b4, Te6edf3familyTff7b72=Tff7b72selfTff7b72.Td2a8ffrpc_typeTb4b4b4, Te6edf3authkeyTff7b72=Tff7b72selfTff7b72.Td2a8ffrpc_keyTb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffrpc_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72or Tff7b72selfTff7b72.Td2a8ffis_standalone_instanceTb4b4b4:
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ff__discovery_enabledTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffenable_discoveryTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ff__discover_interfacesTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffdiscover_interfacesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_sourcesTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffenable_blackhole_updaterTb4b4b4(Tb4b4b4)

Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffexit_handlerTb4b4b4)
Te6edf3signalTff7b72.Td2a8ffsignalTb4b4b4(Te6edf3signalTff7b72.Td2a8ffSIGINTTb4b4b4, Te6edf3ReticulumTff7b72.Td2a8ffsigint_handlerTb4b4b4)
Te6edf3signalTff7b72.Td2a8ffsignalTb4b4b4(Te6edf3signalTff7b72.Td2a8ffSIGTERMTb4b4b4, Te6edf3ReticulumTff7b72.Td2a8ffsigterm_handlerTb4b4b4)

Tff7b72def Td2a8ff__start_jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffjobs_thread Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffjobs_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__jobsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffjobs_threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffjobs_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8fflast_cache_cleanTff7b72+Te6edf3ReticulumTff7b72.Td2a8ffCLEAN_INTERVALTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__clean_cachesTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_cache_clean Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8fflast_data_persistTff7b72+Te6edf3ReticulumTff7b72.Td2a8ffPERSIST_INTERVALTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__persist_dataTb4b4b4(Te6edf3backgroundTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffJOB_INTERVALTb4b4b4)

Tff7b72def Td2a8ff__start_local_interfaceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshare_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3interface Tff7b72= Te6edf3LocalInterfaceTff7b72.Td2a8ffLocalServerInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Tff7b72selfTff7b72.Td2a8fflocal_interface_portTb4b4b4, Te6edf3socket_pathTff7b72=Tff7b72selfTff7b72.Td2a8fflocal_socket_pathTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3ReticulumTb4b4b4, Ta5d6ff"Ta5d6ff_force_shared_instance_bitrateTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ff_force_shared_instance_bitrate
Te6edf3interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ff_force_shared_instance_bitrate
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffForcing shared instance bitrate of Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffbitrateTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequire_shared Tff7b72== Tff7b72TrueTb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffdetachTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffExisting shared instance required, but this instance started as shared instance. Aborting startup.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshared_instance_interface Tff7b72= Te6edf3interface
Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarted shared instance interface: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__start_jobsTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3interface Tff7b72= Te6edf3LocalInterfaceTff7b72.Td2a8ffLocalClientInterfaceTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4,
Ta5d6ff"Ta5d6ffLocal shared instanceTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8fflocal_interface_portTb4b4b4,
Te6edf3socket_pathTff7b72=Tff7b72selfTff7b72.Td2a8fflocal_socket_pathTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8fftarget_port Tff7b72= Tff7b72selfTff7b72.Td2a8fflocal_interface_port
Te6edf3interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3ReticulumTb4b4b4, Ta5d6ff"Ta5d6ff_force_shared_instance_bitrateTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ff_force_shared_instance_bitrate
Te6edf3interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffForcing shared instance bitrate of Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffbitrateTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffis_standalone_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72True
Te6edf3ReticulumTff7b72.Td2a8ff__transport_enabled Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__remote_management_enabled Tff7b72= Tff7b72False
Te6edf3ReticulumTff7b72.Td2a8ff__allow_probes Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConnected to locally available Reticulum instance via: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLocal shared instance appears to be running, but it could not be connectedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffis_standalone_instance Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72and Tff7b72selfTff7b72.Td2a8ffrequire_sharedTb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo shared instance available, but application that started Reticulum required itTa5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffis_standalone_instance Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__start_jobsTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__apply_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffloglevelTa5d6ff" Tff7b72and Tff7b72selfTff7b72.Td2a8ffrequested_loglevel Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tffa657intTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrequested_verbosity Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequested_verbosity
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72< T79c0ff0Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff0
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72> T79c0ff7Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff7
Tff7b72elif Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflogtimestampsTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogtimestamps Tff7b72= Tffa657boolTb4b4b4(Te6edf3valueTb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffreticulumTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffshare_instanceTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshare_instance Tff7b72= Te6edf3value
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffuse_af_unixTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffinstance_nameTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72selfTff7b72.Td2a8fflocal_socket_path Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffshared_instance_typeTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunixTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffshared_instance_portTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflocal_interface_port Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffinstance_control_portTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflocal_control_port Tff7b72= Te6edf3value
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffrpc_keyTa5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3value Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrpc_key Tff7b72= Te6edf3value
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid shared instance RPC key specified, falling back to default keyTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrpc_key Tff7b72= Tff7b72None
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffenable_transportTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__transport_enabled Tff7b72= Tff7b72True
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffstatic_transport_identityTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__static_transport_identity Tff7b72= Tff7b72True

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflocal_hops_deltaTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__local_hops_delta Tff7b72= Tff7b72True

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffnetwork_identityTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ff__network_identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Te6edf3identitypath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3network_identity Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identitypathTb4b4b4)Tb4b4b4:
Te6edf3network_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3network_identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNetwork identity generated and persisted to Tffd700{Te6edf3identitypathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3network_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNetwork identity loaded from Tffd700{Te6edf3identitypathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72if Te6edf3network_identityTb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ff__network_identity Tff7b72= Te6edf3network_identity
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffset_network_identityTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ff__network_identityTb4b4b4)

Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNetwork identity initialisation failedTa5d6ff"Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not set network identity from Tffd700{Te6edf3pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflink_mtu_discoveryTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__link_mtu_discovery Tff7b72= Tff7b72True
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffenable_remote_managementTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__remote_management_enabled Tff7b72= Tff7b72True
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffremote_management_allowedTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72for Te6edf3hexhash Tff7b72in Te6edf3vTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffIdentity hash length for remote management ACL Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hexhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3allowed_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity hash for remote management ACL: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hexhashTb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3allowed_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffremote_management_allowedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffremote_management_allowedTff7b72.Td2a8ffappendTb4b4b4(Te6edf3allowed_hashTb4b4b4)
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffrespond_to_probesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__allow_probes Tff7b72= Tff7b72True
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffforce_shared_instance_bitrateTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Te6edf3ReticulumTff7b72.Td2a8ff_force_shared_instance_bitrate Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffpanic_on_interface_errorTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ffpanic_on_interface_error Tff7b72= Tff7b72True
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffuse_implicit_proofTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__use_implicit_proof Tff7b72= Tff7b72True
Tff7b72if Te6edf3v Tff7b72== Tff7b72FalseTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__use_implicit_proof Tff7b72= Tff7b72False
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdiscover_interfacesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__discover_interfaces Tff7b72= Tff7b72True
Tff7b72if Te6edf3v Tff7b72== Tff7b72FalseTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__discover_interfaces Tff7b72= Tff7b72False
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffrequired_discovery_valueTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72> T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__required_discovery_value Tff7b72= Te6edf3v
Tff7b72elseTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__required_discovery_value Tff7b72= Tff7b72None
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffpublish_blackholeTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__publish_blackhole Tff7b72= Tff7b72True
Tff7b72if Te6edf3v Tff7b72== Tff7b72FalseTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__publish_blackhole Tff7b72= Tff7b72False
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffblackhole_sourcesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72for Te6edf3hexhash Tff7b72in Te6edf3vTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash length for blackhole source Tffd700{Te6edf3hexhashTffd700}Ta5d6ff is invalid, must be Tffd700{Te6edf3dest_lenTffd700}Ta5d6ff hexadecimal characters (Tffd700{Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tffd700}Ta5d6ff bytes).Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3source_identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity hash for remote blackhole source: Tffd700{Te6edf3hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3source_identity_hash Tff7b72in Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_sourcesTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_sourcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3source_identity_hashTb4b4b4)
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffblackhole_update_intervalTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72< T79c0ff2Tb4b4b4: Te6edf3v Tff7b72= T79c0ff2
Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_update_interval Tff7b72= Te6edf3vTff7b72*T79c0ff60

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffinterface_discovery_sourcesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72for Te6edf3hexhash Tff7b72in Te6edf3vTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash length for interface discovery source Tffd700{Te6edf3hexhashTffd700}Ta5d6ff is invalid, must be Tffd700{Te6edf3dest_lenTffd700}Ta5d6ff hexadecimal characters (Tffd700{Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tffd700}Ta5d6ff bytes).Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3source_identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity hash for interface discovery source: Tffd700{Te6edf3hexhashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3source_identity_hash Tff7b72in Te6edf3ReticulumTff7b72.Td2a8ff__interface_sourcesTb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__interface_sourcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3source_identity_hashTb4b4b4)
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffautoconnect_discovered_interfacesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72> T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__autoconnect_discovered_interfaces Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdefault_ar_targetTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72== T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_target Tff7b72= Tff7b72None
Tff7b72elif Te6edf3v Tff7b72> T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_target Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdefault_ar_penaltyTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_penalty Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdefault_ar_graceTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__default_ar_grace Tff7b72= Te6edf3v

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_max_held_announcesTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_max_held_announces Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_burst_holdTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_hold Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_burst_freq_newTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_freq_new Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_burst_freqTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_freq Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_pr_burst_freq_newTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_pr_burst_freq_new Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_pr_burst_freqTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_pr_burst_freq Tff7b72= Te6edf3v

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffec_pr_freqTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ec_pr_freq Tff7b72= Te6edf3v

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffegress_controlTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__egress_control Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_new_timeTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_new_time Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_burst_penaltyTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_burst_penalty Tff7b72= Te6edf3v
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffic_held_release_intervalTa5d6ff"Tb4b4b4:
Te6edf3v Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3v Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3ReticulumTff7b72.Td2a8ff__ic_held_release_interval Tff7b72= Te6edf3v


Tff7b72if Te6edf3RNSTff7b72.Td2a8ffcompiledTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReticulum running in compiled modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReticulum running in interpreted modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffuse_af_unixTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72== Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffuse_af_unix Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffuse_af_unix Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72= Ta5d6ff"Ta5d6fftcpTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffuse_af_unix Tff7b72= Tff7b72False

Tff7b72if Tff7b72selfTff7b72.Td2a8ffshared_instance_type Tff7b72== Ta5d6ff"Ta5d6fftcpTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflocal_socket_path Tff7b72= Tff7b72None

Tff7b72if Tff7b72selfTff7b72.Td2a8fflocal_socket_path Tff7b72== Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffuse_af_unixTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflocal_socket_path Tff7b72= Ta5d6ff"Ta5d6ffdefaultTa5d6ff"

Tff7b72selfTff7b72.Td2a8ff__start_local_interfaceTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_shared_instance Tff7b72or Tff7b72selfTff7b72.Td2a8ffis_standalone_instanceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffBringing up system interfaces...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3interface_names Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffinterfacesTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3name Tff7b72in Te6edf3interface_namesTb4b4b4:
Te6edf3c Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3nameTb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_synthesize_interfaceTb4b4b4(Te6edf3cTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3instance_initTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface name Tffea00\"Ta5d6ff"Tff7b72+Te6edf3nameTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff was already used. Check your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSystem interfaces are readyTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72def Td2a8ff_synthesize_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3instance_initTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3c Tff7b72= Te6edf3config
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72if Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fffullTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffaccess_pointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffaccesspointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffapTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINT
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpointtopointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffptpTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_POINT_TO_POINT
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffroamingTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMING
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffinterface_modeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffboundaryTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARY
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffgatewayTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffgwTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAY
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_INTERNAL

Tff7b72elif Ta5d6ff"Ta5d6ffmodeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fffullTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffaccess_pointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffaccesspointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffapTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINT
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffpointtopointTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffptpTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_POINT_TO_POINT
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffroamingTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ROAMING
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffboundaryTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_BOUNDARY
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffgatewayTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffgwTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAY
Tff7b72elif Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_INTERNAL

Te6edf3ifac_size Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4) Tff7b72>Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffIFAC_MIN_SIZETff7b72*T79c0ff8Tb4b4b4: Te6edf3ifac_size Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4)Tff7b72/Tff7b72/T79c0ff8
Te6edf3ifac_netname Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffnetworknameTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnetworknameTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4: Te6edf3ifac_netname Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnetworknameTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffnetwork_nameTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_nameTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4: Te6edf3ifac_netname Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_nameTa5d6ff"Tb4b4b4]

Te6edf3ifac_netkey Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpassphraseTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffpassphraseTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4: Te6edf3ifac_netkey Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffpassphraseTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffpass_phraseTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffpass_phraseTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4: Te6edf3ifac_netkey Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffpass_phraseTa5d6ff"Tb4b4b4]
Te6edf3ingress_control Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffingress_controlTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ingress_control Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffingress_controlTa5d6ff"Tb4b4b4)
Te6edf3egress_control Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffegress_controlTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3egress_control Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffegress_controlTa5d6ff"Tb4b4b4)
Te6edf3ic_max_held_announces Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_max_held_announcesTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_max_held_announces Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffic_max_held_announcesTa5d6ff"Tb4b4b4)
Te6edf3ic_burst_hold Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_burst_holdTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_burst_hold Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_burst_holdTa5d6ff"Tb4b4b4)
Te6edf3ic_burst_freq_new Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_burst_freq_newTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_burst_freq_new Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_burst_freq_newTa5d6ff"Tb4b4b4)
Te6edf3ic_burst_freq Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_burst_freqTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_burst_freq Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_burst_freqTa5d6ff"Tb4b4b4)
Te6edf3ic_pr_burst_freq_new Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_pr_burst_freq_newTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_pr_burst_freq_new Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_pr_burst_freq_newTa5d6ff"Tb4b4b4)
Te6edf3ic_pr_burst_freq Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_pr_burst_freqTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_pr_burst_freq Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_pr_burst_freqTa5d6ff"Tb4b4b4)
Te6edf3ec_pr_freq Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffec_pr_freqTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ec_pr_freq Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffec_pr_freqTa5d6ff"Tb4b4b4)
Te6edf3ic_new_time Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_new_timeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_new_time Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_new_timeTa5d6ff"Tb4b4b4)
Te6edf3ic_burst_penalty Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_burst_penaltyTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_burst_penalty Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_burst_penaltyTa5d6ff"Tb4b4b4)
Te6edf3ic_held_release_interval Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffic_held_release_intervalTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ic_held_release_interval Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffic_held_release_intervalTa5d6ff"Tb4b4b4)

Te6edf3configured_bitrate Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffbitrateTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4) Tff7b72>Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffMINIMUM_BITRATETb4b4b4: Te6edf3configured_bitrate Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4)

Te6edf3announce_rate_target Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffannounce_rate_targetTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_targetTa5d6ff"Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4: Te6edf3announce_rate_target Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_targetTa5d6ff"Tb4b4b4)
Te6edf3announce_rate_grace Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffannounce_rate_graceTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_graceTa5d6ff"Tb4b4b4) Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3announce_rate_grace Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_graceTa5d6ff"Tb4b4b4)
Te6edf3announce_rate_penalty Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffannounce_rate_penaltyTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_penaltyTa5d6ff"Tb4b4b4) Tff7b72>Tff7b72= T79c0ff0Tb4b4b4: Te6edf3announce_rate_penalty Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_rate_penaltyTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3announce_rate_target Tff7b72!= Tff7b72None Tff7b72and Te6edf3announce_rate_grace Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3announce_rate_grace Tff7b72= T79c0ff0
Tff7b72if Te6edf3announce_rate_target Tff7b72!= Tff7b72None Tff7b72and Te6edf3announce_rate_penalty Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3announce_rate_penalty Tff7b72= T79c0ff0

Te6edf3announce_cap Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffANNOUNCE_CAPTff7b72/T79c0ff100.0
Tff7b72if Ta5d6ff"Ta5d6ffannounce_capTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Tff7b72if Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4) Tff7b72<Tff7b72= T79c0ff100Tb4b4b4:
Te6edf3announce_cap Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffannounce_capTa5d6ff"Tb4b4b4)Tff7b72/T79c0ff100.0

Te6edf3bootstrap_only Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3bootstrap_only Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffbootstrap_onlyTa5d6ff"Tb4b4b4)

Te6edf3recursive_prs Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffrecursive_prsTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3recursive_prs Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffrecursive_prsTa5d6ff"Tb4b4b4)

Te6edf3announces_from_internal Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffannounces_from_internalTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3announces_from_internal Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounces_from_internalTa5d6ff"Tb4b4b4)

Te6edf3ignore_config_warnings Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffignore_config_warningsTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3ignore_config_warnings Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffignore_config_warningsTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3ReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3announce_rate_target Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3announce_rate_target Tff7b72= Tff7b72selfTff7b72.Td2a8ff_default_ar_targetTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3announce_rate_penalty Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3announce_rate_penalty Tff7b72= Tff7b72selfTff7b72.Td2a8ff_default_ar_penaltyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3announce_rate_grace Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3announce_rate_grace Tff7b72= Tff7b72selfTff7b72.Td2a8ff_default_ar_graceTb4b4b4(Tb4b4b4)

Te6edf3discoverable Tff7b72= Tff7b72False
Te6edf3discovery_announce_interval Tff7b72= Tff7b72None
Te6edf3discovery_stamp_value Tff7b72= Tff7b72None
Te6edf3discovery_name Tff7b72= Tff7b72None
Te6edf3discovery_encrypt Tff7b72= Tff7b72False
Te6edf3reachable_on Tff7b72= Tff7b72None
Te6edf3publish_ifac Tff7b72= Tff7b72False
Te6edf3latitude Tff7b72= Tff7b72None
Te6edf3longitude Tff7b72= Tff7b72None
Te6edf3height Tff7b72= Tff7b72None
Te6edf3discovery_location Tff7b72= Tff7b72None
Te6edf3discovery_frequency Tff7b72= Tff7b72None
Te6edf3discovery_bandwidth Tff7b72= Tff7b72None
Te6edf3discovery_modulation Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffdiscoverableTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Te6edf3discoverable Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffdiscoverableTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3discoverableTb4b4b4:
Te6edf3ReticulumTff7b72.Td2a8ff__discovery_enabled Tff7b72= Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Te6edf3cTb4b4b4:
Te6edf3discovery_announce_interval Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)Tff7b72*T79c0ff60
Tff7b72if Te6edf3discovery_announce_interval Tff7b72< T79c0ff5Tff7b72*T79c0ff60Tb4b4b4: Te6edf3discovery_announce_interval Tff7b72= T79c0ff5Tff7b72*T79c0ff60

Tff7b72if Te6edf3discovery_announce_interval Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3discovery_announce_interval Tff7b72= T79c0ff6Tff7b72*T79c0ff60Tff7b72*T79c0ff60
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_stamp_valueTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_stamp_value Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffdiscovery_stamp_valueTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_nameTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_name Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_nameTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_encryptTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_encrypt Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffdiscovery_encryptTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffreachable_onTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3reachable_on Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffreachable_onTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffpublish_ifacTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3publish_ifac Tff7b72= Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffpublish_ifacTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6fflocation_cmdTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_location Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflocation_cmdTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fflatitudeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3latitude Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6fflatitudeTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6fflongitudeTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3longitude Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6fflongitudeTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffheightTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3height Tff7b72= Te6edf3cTff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffheightTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_frequencyTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_frequency Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffdiscovery_frequencyTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_bandwidthTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_bandwidth Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffdiscovery_bandwidthTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_modulationTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3discovery_modulation Tff7b72= Te6edf3cTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffdiscovery_modulationTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3interface_mode Tff7b72in Tb4b4b4[Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAYTb4b4b4, Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINTTb4b4b4, Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_INTERNALTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3ignore_config_warningsTb4b4b4:
Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffRNodeMultiInterfaceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_ACCESS_POINT
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovery enabled on interface Tffd700{Te6edf3nameTffd700}Ta5d6ff without gateway, internal or AP mode. Auto-configured to AP mode.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3interface_mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_GATEWAY
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovery enabled on interface Tffd700{Te6edf3nameTffd700}Ta5d6ff without gateway, internal or AP mode. Auto-configured to gateway mode.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72def Td2a8ffinterface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffoutgoingTa5d6ff" Tff7b72in Te6edf3c Tff7b72and Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4) Tff7b72== Tff7b72FalseTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True

Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72= Te6edf3interface_mode
Te6edf3interfaceTff7b72.Td2a8ffannounce_cap Tff7b72= Te6edf3announce_cap
Te6edf3interfaceTff7b72.Td2a8ffbootstrap_only Tff7b72= Te6edf3bootstrap_only
Tff7b72if Te6edf3configured_bitrateTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3configured_bitrate
Te6edf3interfaceTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3ifac_size Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffifac_size Tff7b72= Te6edf3ifac_size
Tff7b72elseTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffifac_size Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffDEFAULT_IFAC_SIZE

Te6edf3interfaceTff7b72.Td2a8ffdiscoverable Tff7b72= Te6edf3discoverable
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_announce_interval Tff7b72= Te6edf3discovery_announce_interval
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_publish_ifac Tff7b72= Te6edf3publish_ifac
Te6edf3interfaceTff7b72.Td2a8ffreachable_on Tff7b72= Te6edf3reachable_on
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_name Tff7b72= Te6edf3discovery_name
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_encrypt Tff7b72= Te6edf3discovery_encrypt
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_stamp_value Tff7b72= Te6edf3discovery_stamp_value
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_location Tff7b72= Te6edf3discovery_location
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_latitude Tff7b72= Te6edf3latitude
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_longitude Tff7b72= Te6edf3longitude
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_height Tff7b72= Te6edf3height
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_frequency Tff7b72= Te6edf3discovery_frequency
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_bandwidth Tff7b72= Te6edf3discovery_bandwidth
Te6edf3interfaceTff7b72.Td2a8ffdiscovery_modulation Tff7b72= Te6edf3discovery_modulation

Te6edf3interfaceTff7b72.Td2a8ffrecursive_prs Tff7b72= Te6edf3recursive_prs
Te6edf3interfaceTff7b72.Td2a8ffannounces_from_internal Tff7b72= Te6edf3announces_from_internal
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_target Tff7b72= Te6edf3announce_rate_target
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Te6edf3announce_rate_grace
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Te6edf3announce_rate_penalty
Te6edf3interfaceTff7b72.Td2a8ffingress_control Tff7b72= Te6edf3ingress_control

Tff7b72if Te6edf3egress_control Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffegress_control Tff7b72= Te6edf3egress_control
Tff7b72if Te6edf3ic_max_held_announces Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_max_held_announces Tff7b72= Te6edf3ic_max_held_announces
Tff7b72if Te6edf3ic_burst_hold Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_burst_hold Tff7b72= Te6edf3ic_burst_hold
Tff7b72if Te6edf3ic_burst_freq_new Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_burst_freq_new Tff7b72= Te6edf3ic_burst_freq_new
Tff7b72if Te6edf3ic_burst_freq Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_burst_freq Tff7b72= Te6edf3ic_burst_freq
Tff7b72if Te6edf3ic_pr_burst_freq_new Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_pr_burst_freq_new Tff7b72= Te6edf3ic_pr_burst_freq_new
Tff7b72if Te6edf3ic_pr_burst_freq Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_pr_burst_freq Tff7b72= Te6edf3ic_pr_burst_freq
Tff7b72if Te6edf3ec_pr_freq Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffec_pr_freq Tff7b72= Te6edf3ec_pr_freq
Tff7b72if Te6edf3ic_new_time Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_new_time Tff7b72= Te6edf3ic_new_time
Tff7b72if Te6edf3ic_burst_penalty Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_burst_penalty Tff7b72= Te6edf3ic_burst_penalty
Tff7b72if Te6edf3ic_held_release_interval Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffic_held_release_interval Tff7b72= Te6edf3ic_held_release_interval

Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72= Te6edf3ifac_netname
Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72= Te6edf3ifac_netkey

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72None Tff7b72or Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netnameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netkeyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3ifac_origin_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3ifac_originTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffifac_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(Te6edf3lengthTff7b72=T79c0ff64Tb4b4b4, Te6edf3derive_fromTff7b72=Te6edf3ifac_origin_hashTb4b4b4,
Te6edf3saltTff7b72=Tff7b72selfTff7b72.Td2a8ffifac_saltTb4b4b4, Te6edf3contextTff7b72=Tff7b72NoneTb4b4b4)

Te6edf3interfaceTff7b72.Td2a8ffifac_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffifac_signature Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8fffinal_initTb4b4b4(Tb4b4b4)

Te6edf3interface Tff7b72= Tff7b72None
Tff7b72if Tb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff" Tff7b72in Te6edf3cTb4b4b4) Tff7b72and Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffinterface_enabledTa5d6ff"Tb4b4b4) Tff7b72== Tff7b72TrueTb4b4b4) Tff7b72or Tb4b4b4(Tb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff" Tff7b72in Te6edf3cTb4b4b4) Tff7b72and Te6edf3cTff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4) Tff7b72== Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3interface_config Tff7b72= Te6edf3c
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3name
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffselected_interface_modeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interface_mode
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3configured_bitrate

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffAutoInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff" Tff7b72or Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBackboneClientInterfaceTa5d6ff"Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflisten_portTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffportTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_portTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffremoteTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftarget_hostTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffremoteTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6fflisten_onTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflisten_ipTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fflisten_onTa5d6ff"Tb4b4b4]

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBackboneInterfaceTa5d6ff"Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6fftarget_hostTa5d6ff" Tff7b72in Te6edf3cTb4b4b4: Te6edf3interface Tff7b72= Te6edf3BackboneInterfaceTff7b72.Td2a8ffBackboneClientInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3interface Tff7b72= Te6edf3BackboneInterfaceTff7b72.Td2a8ffBackboneInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBackboneClientInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3BackboneInterfaceTff7b72.Td2a8ffBackboneClientInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffUDPInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3UDPInterfaceTff7b72.Td2a8ffUDPInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTCPServerInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3TCPInterfaceTff7b72.Td2a8ffTCPServerInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3TCPInterfaceTff7b72.Td2a8ffTCPClientInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffstoragepathTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffstoragepath
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3ifac_netname
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffifac_netkeyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3ifac_netkey
Te6edf3interface_configTb4b4b4[Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3ifac_size

Te6edf3interface Tff7b72= Te6edf3I2PInterfaceTff7b72.Td2a8ffI2PInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffSerialInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3SerialInterfaceTff7b72.Td2a8ffSerialInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffPipeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3PipeInterfaceTff7b72.Td2a8ffPipeInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffKISSInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3KISSInterfaceTff7b72.Td2a8ffKISSInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffAX25KISSInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3AX25KISSInterfaceTff7b72.Td2a8ffAX25KISSInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffRNodeInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3RNodeInterfaceTff7b72.Td2a8ffRNodeInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffRNodeMultiInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3RNodeMultiInterfaceTff7b72.Td2a8ffRNodeMultiInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4:
Te6edf3interface Tff7b72= Te6edf3WeaveInterfaceTff7b72.Td2a8ffWeaveInterfaceTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72if Te6edf3bootstrap_only Tff7b72and Te6edf3instance_initTb4b4b4: Tff7b72selfTff7b72.Td2a8ffbootstrap_configsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3interface_configTb4b4b4)

Tff7b72if Te6edf3interface Tff7b72== Tff7b72NoneTb4b4b4:
T8b949e# Interface was not handled by any internal interface types,
T8b949e# attempt to load and initialise it from user-supplied modules
Te6edf3interface_type Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Te6edf3interface_file Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff.pyTa5d6ff"
Te6edf3interface_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinterfacepathTb4b4b4, Te6edf3interface_fileTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3interface_pathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not locate external interface module Tffea00\"Tffd700{Te6edf3interface_fileTffd700}Tffea00\"Ta5d6ff in Tffea00\"Tffd700{Tff7b72selfTff7b72.Td2a8ffinterfacepathTffd700}Tffea00\"Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLoading external interface Tffea00\"Tffd700{Te6edf3interface_fileTffd700}Tffea00\"Ta5d6ff from Tffea00\"Tffd700{Tff7b72selfTff7b72.Td2a8ffinterfacepathTffd700}Tffea00\"Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Te6edf3interface_globals Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3interface_globalsTb4b4b4[Ta5d6ff"Ta5d6ffInterfaceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterface
Te6edf3interface_globalsTb4b4b4[Ta5d6ff"Ta5d6ffRNSTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNS
Tff7b72with Tffa657openTb4b4b4(Te6edf3interface_pathTb4b4b4) Tff7b72as Te6edf3class_fileTb4b4b4:
Te6edf3interface_code Tff7b72= Te6edf3class_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3execTb4b4b4(Te6edf3interface_codeTb4b4b4, Te6edf3interface_globalsTb4b4b4)
Te6edf3interface_class Tff7b72= Te6edf3interface_globalsTb4b4b4[Ta5d6ff"Ta5d6ffinterface_classTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3interface_class Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3interface Tff7b72= Te6edf3interface_classTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Te6edf3interface_configTb4b4b4)
Te6edf3interface_post_initTb4b4b4(Te6edf3interfaceTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffExternal interface initialisation failed for Tffd700{Te6edf3interface_typeTffd700}Ta5d6ff / Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSkipping disabled interface Tffea00\"Ta5d6ff"Tff7b72+Te6edf3nameTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface Tffea00\"Ta5d6ff"Tff7b72+Te6edf3nameTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff could not be created. Check your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_add_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4, Te6edf3mode Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3configured_bitrateTff7b72=Tff7b72NoneTb4b4b4, Te6edf3ifac_sizeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3ifac_netnameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3ifac_netkeyTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3announce_capTff7b72=Tff7b72NoneTb4b4b4, Te6edf3announce_rate_targetTff7b72=Tff7b72NoneTb4b4b4, Te6edf3announce_rate_graceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3announce_rate_penaltyTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3bootstrap_onlyTff7b72=Tff7b72FalseTb4b4b4, Te6edf3recursive_prsTff7b72=Tff7b72FalseTb4b4b4, Te6edf3announces_from_internalTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3interface Tff7b72!= Tff7b72None Tff7b72and Tffa657issubclassTb4b4b4(Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3mode Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3mode Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Te6edf3interfaceTff7b72.Td2a8ffmode Tff7b72= Te6edf3mode
Te6edf3interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True

Tff7b72if Te6edf3configured_bitrateTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3configured_bitrate
Tff7b72if Te6edf3bootstrap_only Tff7b72== Tff7b72TrueTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffbootstrap_only Tff7b72= Tff7b72True
Te6edf3interfaceTff7b72.Td2a8ffoptimise_mtuTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3ifac_size Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffifac_size Tff7b72= Te6edf3ifac_size
Tff7b72elseTb4b4b4: Te6edf3interfaceTff7b72.Td2a8ffifac_size Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffDEFAULT_IFAC_SIZE

Te6edf3interfaceTff7b72.Td2a8ffrecursive_prs Tff7b72= Te6edf3recursive_prs
Te6edf3interfaceTff7b72.Td2a8ffannounces_from_internal Tff7b72= Te6edf3announces_from_internal
Te6edf3interfaceTff7b72.Td2a8ffannounce_cap Tff7b72= Te6edf3announce_cap Tff7b72if Te6edf3announce_cap Tff7b72!= Tff7b72None Tff7b72else Te6edf3ReticulumTff7b72.Td2a8ffANNOUNCE_CAPTff7b72/T79c0ff100.0
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_target Tff7b72= Te6edf3announce_rate_target
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Te6edf3announce_rate_grace
Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Te6edf3announce_rate_penalty

Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72= Te6edf3ifac_netname
Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72= Te6edf3ifac_netkey

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72None Tff7b72or Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netname Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netnameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffifac_netkey Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifac_origin Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_netkeyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3ifac_origin_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3ifac_originTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffifac_key Tff7b72= Te6edf3RNSTff7b72.Td2a8ffCryptographyTff7b72.Td2a8ffhkdfTb4b4b4(Te6edf3lengthTff7b72=T79c0ff64Tb4b4b4, Te6edf3derive_fromTff7b72=Te6edf3ifac_origin_hashTb4b4b4,
Te6edf3saltTff7b72=Tff7b72selfTff7b72.Td2a8ffifac_saltTb4b4b4, Te6edf3contextTff7b72=Tff7b72NoneTb4b4b4)

Te6edf3interfaceTff7b72.Td2a8ffifac_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8ffifac_signature Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_identityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffifac_keyTb4b4b4)Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffadd_interfaceTb4b4b4(Te6edf3interfaceTb4b4b4)
Te6edf3interfaceTff7b72.Td2a8fffinal_initTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_default_ar_targetTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__default_ar_target Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffDEFAULT_AR_TARGET

Tff7b72def Td2a8ff_default_ar_penaltyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__default_ar_penalty Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffDEFAULT_AR_PENALTY

Tff7b72def Td2a8ff_default_ar_graceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__default_ar_grace Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffDEFAULT_AR_GRACE

Tff7b72def Td2a8ff_default_ic_max_held_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_max_held_announces Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMAX_HELD_ANNOUNCES

Tff7b72def Td2a8ff_default_ic_burst_holdTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_burst_hold Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_BURST_HOLD

Tff7b72def Td2a8ff_default_ic_burst_freq_newTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_burst_freq_new Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_BURST_FREQ_NEW

Tff7b72def Td2a8ff_default_ic_burst_freqTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_burst_freq Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_BURST_FREQ

Tff7b72def Td2a8ff_default_ic_pr_burst_freq_newTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_pr_burst_freq_new Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_PR_BURST_FREQ_NEW

Tff7b72def Td2a8ff_default_ic_pr_burst_freqTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_pr_burst_freq Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_PR_BURST_FREQ

Tff7b72def Td2a8ff_default_ec_pr_freqTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ec_pr_freq Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffEC_PR_FREQ

Tff7b72def Td2a8ff_default_egress_controlTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__egress_control Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffEGRESS_CONTROL

Tff7b72def Td2a8ff_default_ic_new_timeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_new_time Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_NEW_TIME

Tff7b72def Td2a8ff_default_ic_burst_penaltyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_burst_penalty Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_BURST_PENALTY

Tff7b72def Td2a8ff_default_ic_held_release_intervalTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff__ic_held_release_interval Tff7b72or Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffIC_HELD_RELEASE_INTERVAL

Tff7b72def Td2a8ff_should_persist_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8fflast_data_persistTff7b72+Te6edf3ReticulumTff7b72.Td2a8ffGRACIOUS_PERSIST_INTERVALTb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff__persist_dataTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Tff7b72if Te6edf3backgroundTb4b4b4: Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3jobTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__persist_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ffgracious_persist_lockTff7b72.Td2a8fflockedTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72with Te6edf3ReticulumTff7b72.Td2a8ffgracious_persist_lockTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpersist_dataTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffpersist_dataTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_data_persist Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff__clean_cachesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3backgroundTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCleaning resource and packet caches...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

T8b949e# Clean resource caches
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresourcepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3filenameTb4b4b4) Tff7b72== Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4:
Te6edf3filepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffresourcepath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3filename
Te6edf3mtime Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetmtimeTb4b4b4(Te6edf3filepathTb4b4b4)
Te6edf3age Tff7b72= Te6edf3now Tff7b72- Te6edf3mtime
Tff7b72if Te6edf3age Tff7b72> Te6edf3ReticulumTff7b72.Td2a8ffRESOURCE_CACHETb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filepathTb4b4b4)
Tff7b72if Te6edf3backgroundTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while cleaning resources cache, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

T8b949e# Clean packet caches
Tff7b72for Te6edf3filename Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3filenameTb4b4b4) Tff7b72== Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4:
Te6edf3filepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffcachepath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3filename
Te6edf3mtime Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetmtimeTb4b4b4(Te6edf3filepathTb4b4b4)
Te6edf3age Tff7b72= Te6edf3now Tff7b72- Te6edf3mtime
Tff7b72if Te6edf3age Tff7b72> Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffDESTINATION_TIMEOUTTb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filepathTb4b4b4)
Tff7b72if Te6edf3backgroundTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while cleaning resources cache, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ff__create_default_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_rns_config__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fffilename Tff7b72= Te6edf3ReticulumTff7b72.Td2a8ffconfigpath
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffconfigdirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffrpc_returnTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3connectionTb4b4b4, Te6edf3responseTb4b4b4)Tb4b4b4:
Te6edf3connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3responseTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffrpc_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ff_should_runTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3conn Tff7b72= Tff7b72selfTff7b72.Td2a8ffrpc_listenerTff7b72.Td2a8ffacceptTb4b4b4(Tb4b4b4)
Te6edf3call Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3connTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffgetTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3path Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4]

Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffpath_tableTa5d6ff"Tb4b4b4:
Te6edf3mh Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffmax_hopsTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_path_tableTb4b4b4(Te6edf3max_hopsTff7b72=Te6edf3mhTb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffinterface_statsTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_interface_statsTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffrate_tableTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_rate_tableTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffnext_hop_if_nameTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_next_hop_if_nameTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffnext_hopTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_next_hopTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6fffirst_hop_timeoutTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_first_hop_timeoutTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6fflink_countTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_link_countTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffpacket_rssiTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_packet_rssiTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffpacket_snrTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_packet_snrTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffpacket_qTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_packet_qTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffblackholed_identitiesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_blackholed_identitiesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffis_blackholedTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffis_blackholedTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffdropTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3path Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdropTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdrop_pathTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffall_viaTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdrop_all_viaTb4b4b4(Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffannounce_queuesTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffblackhole_identityTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3identity_hash Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffblackhole_identityTa5d6ff"Tb4b4b4]
Te6edf3until Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4]
Te6edf3reason Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4, Te6edf3untilTff7b72=Te6edf3untilTb4b4b4, Te6edf3reasonTff7b72=Te6edf3reasonTb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffunblackhole_identityTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3identity_hash Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffunblackhole_identityTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ffunblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffdestination_dataTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3operation Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_dataTa5d6ff"Tb4b4b4]
Te6edf3destination_hash Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3operation Tff7b72== Ta5d6ff"Ta5d6ffusedTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3operation Tff7b72== Ta5d6ff"Ta5d6ffretainTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_retain_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3operation Tff7b72== Ta5d6ff"Ta5d6ffunretainTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_unretain_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffidentity_dataTa5d6ff" Tff7b72in Te6edf3callTb4b4b4:
Te6edf3operation Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffidentity_dataTa5d6ff"Tb4b4b4]
Te6edf3identity_hash Tff7b72= Te6edf3callTb4b4b4[Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3operation Tff7b72== Ta5d6ff"Ta5d6ffretainTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrpc_returnTb4b4b4(Te6edf3connTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_retain_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4)

Te6edf3connTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while handling RPC call from local client: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffget_rpc_clientTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3multiprocessingTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffClientTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrpc_addrTb4b4b4, Te6edf3familyTff7b72=Tff7b72selfTff7b72.Td2a8ffrpc_typeTb4b4b4, Te6edf3authkeyTff7b72=Tff7b72selfTff7b72.Td2a8ffrpc_keyTb4b4b4)

Tff7b72def Td2a8ff_used_destination_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_dataTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffusedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffShared instance RPC failed while setting destination data use: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_used_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)

Tff7b72def Td2a8ff_retain_destination_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_dataTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffretainTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffShared instance RPC failed while retaining destination data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_retain_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)

Tff7b72def Td2a8ff_unretain_destination_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_dataTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffunretainTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffShared instance RPC failed while unretaining destination data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_unretain_destination_dataTb4b4b4(Te6edf3destination_hashTb4b4b4)

Tff7b72def Td2a8ff_retain_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72!= Tffa657bytes Tff7b72or Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffCannot retain identity, not a valid identity hashTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffidentity_dataTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffretainTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3identity_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffShared instance RPC failed while retaining identity: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ff_retain_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)

Tff7b72def Td2a8ffget_interface_statsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinterface_statsTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Te6edf3interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3interface Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3ifstats Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffclients
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3interfaceTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffparent_interface_nameTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffparent_interfaceTb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffparent_interface_hashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffi2pTa5d6ff"Tb4b4b4) Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffconnectableTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffconnectableTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffi2p_connectableTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffb32Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffb32 Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffi2p_b32Ta5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffb32Tff7b72+Ta5d6ff"Ta5d6ff.b32.i2pTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffi2p_b32Ta5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffi2p_tunnel_stateTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffi2p_tunnel_state Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3state_description Tff7b72= Ta5d6ff"Ta5d6ffUnknown StateTa5d6ff"
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3I2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_ACTIVETb4b4b4:
Te6edf3state_description Tff7b72= Ta5d6ff"Ta5d6ffTunnel ActiveTa5d6ff"
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3I2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_INITTb4b4b4:
Te6edf3state_description Tff7b72= Ta5d6ff"Ta5d6ffCreating TunnelTa5d6ff"
Tff7b72elif Te6edf3interfaceTff7b72.Td2a8ffi2p_tunnel_state Tff7b72== Te6edf3I2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTff7b72.Td2a8ffTUNNEL_STATE_STALETb4b4b4:
Te6edf3state_description Tff7b72= Ta5d6ff"Ta5d6ffTunnel UnresponsiveTa5d6ff"
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftunnelstateTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3state_description
Tff7b72elseTb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftunnelstateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_airtime_shortTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffairtime_shortTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_airtime_short
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_airtime_longTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffairtime_longTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_airtime_long
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_channel_load_shortTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffchannel_load_shortTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_channel_load_short
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_channel_load_longTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffchannel_load_longTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_channel_load_long
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_noise_floorTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffnoise_floorTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_noise_floor
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_interferenceTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffinterferenceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_interference
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffcpu_tempTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffcpu_tempTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcpu_temp
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffcpu_loadTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffcpu_loadTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcpu_load
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffmem_loadTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffmem_loadTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffmem_load

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_interference_lTa5d6ff"Tb4b4b4) Tff7b72and Tffa657typeTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffr_interference_lTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffinterference_last_tsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_interference_lTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffinterference_last_dbmTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_interference_lTb4b4b4[T79c0ff1Tb4b4b4]

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffswitch_idTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffswitch_id Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffswitch_idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffswitch_idTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffswitch_idTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffvia_switch_idTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffvia_switch_id Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffvia_switch_idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffvia_switch_idTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffvia_switch_idTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffendpoint_idTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffendpoint_id Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffendpoint_idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffendpoint_idTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffendpoint_idTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_battery_stateTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffr_battery_state Tff7b72!= T79c0ff0x00Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffbattery_stateTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffget_battery_state_stringTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffr_battery_percentTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffbattery_percentTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffr_battery_percent

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffbitrate Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffbitrate
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffbitrateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffcurrent_rx_speedTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffcurrent_rx_speed Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffrxsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcurrent_rx_speed
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffrxsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffrxsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffcurrent_tx_speedTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffcurrent_tx_speed Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftxsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffcurrent_tx_speed
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftxsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftxsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffpeers Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffpeersTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_signature
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_size
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffifac_netname
Tff7b72elseTb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_signatureTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_sizeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffautoconnect_sourceTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffautoconnect_sourceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffautoconnect_source
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffautoconnect_sourceTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3interfaceTff7b72.Td2a8ffannounce_queue Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffannounce_queueTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_queueTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffblocked_ip_countTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffblocked_ipsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffblocked_ip_count

Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3interfaceTb4b4b4, Ta5d6ff"Ta5d6ffblocked_ip_listTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffblocked_ip_listTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffblocked_ip_list

Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3interfaceTb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffshort_nameTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffnameTb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffget_hashTb4b4b4(Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72= Tffa657strTb4b4b4(Tffa657typeTb4b4b4(Te6edf3interfaceTb4b4b4)Tff7b72.Td2a8ff__name__Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffrxb
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8fftxb
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffincoming_announce_frequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffincoming_announce_frequencyTb4b4b4(Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffoutgoing_announce_frequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffoutgoing_announce_frequencyTb4b4b4(Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffincoming_pr_frequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffincoming_pr_frequencyTb4b4b4(Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffoutgoing_pr_frequencyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffoutgoing_pr_frequencyTb4b4b4(Tb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_rate_targetTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_target
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_rate_penaltyTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_penalty
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_rate_graceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffannounce_rate_grace
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffheld_announcesTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Te6edf3interfaceTff7b72.Td2a8ffheld_announcesTb4b4b4)
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffburst_activeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffic_burst_active
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffburst_activatedTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffic_burst_activated
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffpr_burst_activeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffic_pr_burst_active
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffpr_burst_activatedTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffic_pr_burst_activated
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffonline
Te6edf3ifstatsTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaceTff7b72.Td2a8ffmode

Te6edf3interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ifstatsTb4b4b4)

Te6edf3stats Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3interfaces
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffrxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fftraffic_rxb
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftxbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fftraffic_txb
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffrxsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffspeed_rx
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftxsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffspeed_tx

Tff7b72if Te6edf3ReticulumTff7b72.Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnetwork_identityTff7b72.Td2a8ffhash Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnetwork_identity Tff7b72else Tff7b72None
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftransport_uptimeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffstart_time
Tff7b72if Te6edf3ReticulumTff7b72.Td2a8ffprobe_destination_enabledTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffprobe_responderTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffprobe_destinationTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4: Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffprobe_responderTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_specTb4b4b4(Ta5d6ff'Ta5d6ffpsutilTa5d6ff'Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72import T7ee787psutil
Te6edf3process Tff7b72= Te6edf3psutilTff7b72.Td2a8ffProcessTb4b4b4(Tb4b4b4)
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffrssTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3processTff7b72.Td2a8ffmemory_infoTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrss
Tff7b72elseTb4b4b4:
Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffrssTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72return Te6edf3stats

Tff7b72def Td2a8ffget_path_tableTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3max_hopsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath_tableTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmax_hopsTa5d6ff"Tb4b4b4: Te6edf3max_hopsTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Te6edf3path_table Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3dst_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Te6edf3path_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72if Te6edf3max_hops Tff7b72== Tff7b72None Tff7b72or Te6edf3path_hops Tff7b72<Tff7b72= Te6edf3max_hopsTb4b4b4:
Te6edf3entry Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3dst_hashTb4b4b4, Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffviaTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4: Te6edf3path_hopsTb4b4b4,
Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4) Tb4b4b4}
Te6edf3path_tableTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)

Tff7b72return Te6edf3path_table

Tff7b72def Td2a8ffget_rate_tableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrate_tableTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Te6edf3rate_table Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3dst_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4:
Te6edf3entry Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3dst_hashTb4b4b4,
Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffannounce_rate_tableTb4b4b4[Te6edf3dst_hashTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Te6edf3rate_tableTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)

Tff7b72return Te6edf3rate_table

Tff7b72def Td2a8ffdrop_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdropTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destinationTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffexpire_pathTb4b4b4(Te6edf3destinationTb4b4b4)

Tff7b72def Td2a8ffdrop_all_viaTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transport_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdropTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffall_viaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3transport_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Te6edf3dropped_count Tff7b72= T79c0ff0
Tff7b72for Te6edf3destination_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffpath_tableTb4b4b4[Te6edf3destination_hashTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Te6edf3transport_hashTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffexpire_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3dropped_count Tff7b72+Tff7b72= T79c0ff1

Tff7b72return Te6edf3dropped_count

Tff7b72def Td2a8ffdrop_announce_queuesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffdropTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffannounce_queuesTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_next_hop_if_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnext_hop_if_nameTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destinationTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnext_hop_interfaceTb4b4b4(Te6edf3destinationTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffget_first_hop_timeoutTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffirst_hop_timeoutTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destinationTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72and Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_force_shared_instance_bitrateTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ff_force_shared_instance_bitrateTb4b4b4:
Te6edf3simulated_latency Tff7b72= Tb4b4b4(Tb4b4b4(T79c0ff1Tff7b72/Tff7b72selfTff7b72.Td2a8ff_force_shared_instance_bitrateTb4b4b4)Tff7b72*T79c0ff8Tb4b4b4)Tff7b72*Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffMTU
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAdding simulated latency of Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3simulated_latencyTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to first hop timeoutTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3response Tff7b72+Tff7b72= Te6edf3simulated_latency

Tff7b72return Te6edf3response
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while getting first hop timeout from shared instance: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffDEFAULT_PER_HOP_TIMEOUT

Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fffirst_hop_timeoutTb4b4b4(Te6edf3destinationTb4b4b4)

Tff7b72def Td2a8ffget_next_hopTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffnext_hopTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destinationTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffnext_hopTb4b4b4(Te6edf3destinationTb4b4b4)

Tff7b72def Td2a8ffget_link_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflink_countTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflink_tableTb4b4b4)

Tff7b72def Td2a8ffget_packet_rssiTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packet_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpacket_rssiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4: Te6edf3packet_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_rssi_cacheTb4b4b4:
Tff7b72if Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3packet_hashTb4b4b4:
Tff7b72return Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]

Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_packet_snrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packet_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpacket_snrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4: Te6edf3packet_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_snr_cacheTb4b4b4:
Tff7b72if Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3packet_hashTb4b4b4:
Tff7b72return Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]

Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_packet_qTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packet_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpacket_qTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpacket_hashTa5d6ff"Tb4b4b4: Te6edf3packet_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_q_cacheTb4b4b4:
Tff7b72if Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3packet_hashTb4b4b4:
Tff7b72return Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]

Tff7b72return Tff7b72None

Tff7b72def Td2a8ffhalt_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffresume_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffreload_interfaceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3interfaceTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffget_blackholed_identitiesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffblackholed_identitiesTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identities

Tff7b72def Td2a8ffis_blackholedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4: Te6edf3identity_hash Tff7b72= Te6edf3identityTff7b72.Td2a8ffhash
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3identityTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4: Te6edf3identity_hash Tff7b72= Te6edf3identity
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity for blackhole check, must be hash as bytes or RNS.IdentityTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid identity hash length for blackhole checkTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffgetTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffis_blackholedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Te6edf3identity_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response

Tff7b72elseTb4b4b4: Tff7b72return Te6edf3identity_hash Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackholed_identities

Tff7b72def Td2a8ffblackhole_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4, Te6edf3untilTff7b72=Tff7b72NoneTb4b4b4, Te6edf3reasonTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffblackhole_identityTa5d6ff"Tb4b4b4: Te6edf3identity_hashTb4b4b4, Ta5d6ff"Ta5d6ffuntilTa5d6ff"Tb4b4b4: Te6edf3untilTb4b4b4, Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4: Te6edf3reasonTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4, Te6edf3untilTff7b72=Te6edf3untilTb4b4b4, Te6edf3reasonTff7b72=Te6edf3reasonTb4b4b4)

Tff7b72def Td2a8ffunblackhole_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3rpc_connection Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_rpc_clientTb4b4b4(Tb4b4b4)
Te6edf3rpc_connectionTff7b72.Td2a8ffsend_bytesTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffunblackhole_identityTa5d6ff"Tb4b4b4: Te6edf3identity_hashTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3response Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3rpc_connectionTff7b72.Td2a8ffrecv_bytesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3response
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffunblackhole_identityTb4b4b4(Te6edf3identity_hashTb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffshould_use_implicit_proofTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns whether proofs sent are explicit or implicit.

:returns: True if the current running configuration specifies to use implicit proofs. False if not.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__use_implicit_proof

Tf0883e@staticmethod
Tff7b72def Td2a8fftransport_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns whether Transport is enabled for the running
instance.

When Transport is enabled, Reticulum will
route traffic for other peers, respond to path requests
and pass announces over the network.

:returns: True if Transport is enabled, False if not.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__transport_enabled

Tf0883e@staticmethod
Tff7b72def Td2a8fflink_mtu_discoveryTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns whether link MTU discovery is enabled for the running
instance.

When link MTU discovery is enabled, Reticulum will
automatically upgrade link MTUs to the highest supported
value, increasing transfer speed and efficiency.

:returns: True if link MTU discovery is enabled, False if not.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__link_mtu_discovery

Tf0883e@staticmethod
Tff7b72def Td2a8ffremote_management_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns whether remote management is enabled for the
running instance.

When remote management is enabled, authenticated peers
can remotely query and manage this instance.

:returns: True if remote management is enabled, False if not.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__remote_management_enabled

Tf0883e@staticmethod
Tff7b72def Td2a8ffprobe_destination_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__allow_probes

Tf0883e@staticmethod
Tff7b72def Td2a8ffrequired_discovery_valueTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns the required stamp value for a discovered interface
to be considered valid and remembered.

:returns: The required stamp value as an integer.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__required_discovery_value

Tf0883e@staticmethod
Tff7b72def Td2a8ffpublish_blackhole_enabledTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns whether blackhole list publishing is enabled for the
running instance.

:returns: True if blackhole list publishing is enabled, False if not.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__publish_blackhole

Tf0883e@staticmethod
Tff7b72def Td2a8ffblackhole_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns the list of transport identity hashes from which
blackhole lists are sourced.

:returns: A list of identity hashes.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_sources

Tf0883e@staticmethod
Tff7b72def Td2a8ffblackhole_update_intervalTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__blackhole_update_interval

Tf0883e@staticmethod
Tff7b72def Td2a8ffdiscovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns a list of interfaces discovered over the network.

:returns: A list of discovered interfaces.
"""
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffDiscoveryTff7b72.Td2a8ffInterfaceDiscoveryTb4b4b4(Te6edf3discover_interfacesTff7b72=Tff7b72FalseTb4b4b4)Tff7b72.Td2a8fflist_discovered_interfacesTb4b4b4(Tb4b4b4)

Tf0883e@staticmethod
Tff7b72def Td2a8ffinterface_discovery_sourcesTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Returns the list of network identity hashes from which
interfaces are discovered.

:returns: A list of identity hashes.
"""
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__interface_sources

Tf0883e@staticmethod
Tff7b72def Td2a8ffshould_autoconnect_discovered_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__autoconnect_discovered_interfaces Tff7b72> T79c0ff0

Tf0883e@staticmethod
Tff7b72def Td2a8ffmax_autoconnected_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__autoconnect_discovered_interfaces

Tf0883e@staticmethod
Tff7b72def Td2a8ffstatic_transport_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__static_transport_identity

Tf0883e@staticmethod
Tff7b72def Td2a8fflocal_hops_deltaTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ReticulumTff7b72.Td2a8ff__local_hops_delta

T8b949e# Default configuration file:
Te6edf3__default_rns_config__ Tff7b72= Ta5d6ff'''Ta5d6ff# This is the default Reticulum config file.
Ta5d6ff# You should probably edit it to include any additional,
Ta5d6ff# interfaces and settings you might need.

Ta5d6ff# Only the most basic options are included in this default
Ta5d6ff# configuration. To see a more verbose, and much longer,
Ta5d6ff# configuration example, you can run the command:
Ta5d6ff# rnsd --exampleconfig


Ta5d6ff[reticulum]

Ta5d6ff# If you enable Transport, your system will route traffic
Ta5d6ff# for other peers, pass announces and serve path requests.
Ta5d6ff# This should only be done for systems that are suited to
Ta5d6ff# act as transport nodes, ie. if they are stationary and
Ta5d6ff# always-on. This directive is optional and can be removed
Ta5d6ff# for brevity.

Ta5d6ffenable_transport = False


Ta5d6ff# By default, the first program to launch the Reticulum
Ta5d6ff# Network Stack will create a shared instance, that other
Ta5d6ff# programs can communicate with. Only the shared instance
Ta5d6ff# opens all the configured interfaces directly, and other
Ta5d6ff# local programs communicate with the shared instance over
Ta5d6ff# a local socket. This is completely transparent to the
Ta5d6ff# user, and should generally be turned on. This directive
Ta5d6ff# is optional and can be removed for brevity.

Ta5d6ffshare_instance = Yes


Ta5d6ff# If you want to run multiple *different* shared instances
Ta5d6ff# on the same system, you will need to specify different
Ta5d6ff# instance names for each. On platforms supporting domain
Ta5d6ff# sockets, this can be done with the instance_name option:

Ta5d6ffinstance_name = default


Ta5d6ff# Some platforms donTa5d6ff'Ta5d6fft support domain sockets, and if that
Ta5d6ff# is the case, you can isolate different instances by
Ta5d6ff# specifying a unique set of ports for each:

Ta5d6ff# shared_instance_port = 37428
Ta5d6ff# instance_control_port = 37429


Ta5d6ff# If you want to explicitly use TCP for shared instance
Ta5d6ff# communication, instead of domain sockets, this is also
Ta5d6ff# possible, by using the following option:

Ta5d6ff# shared_instance_type = tcp


Ta5d6ff# You can configure whether Reticulum should discover
Ta5d6ff# available interfaces from other Transport Instances over
Ta5d6ff# the network. If this option is enabled, Reticulum will
Ta5d6ff# collect interface information discovered from the network.

Ta5d6ff# discover_interfaces = No


Ta5d6ff# You can configure Reticulum to panic and forcibly close
Ta5d6ff# if an unrecoverable interface error occurs, such as the
Ta5d6ff# hardware device for an interface disappearing. This is
Ta5d6ff# an optional directive, and can be left out for brevity.
Ta5d6ff# This behaviour is disabled by default.

Ta5d6ff# panic_on_interface_error = No


Ta5d6ff# If youTa5d6ff'Ta5d6ffre connecting to a large external network, you
Ta5d6ff# can use one or more external blackhole list to block
Ta5d6ff# spammy and excessive announces onto your network. This
Ta5d6ff# funtionality is especially useful if youTa5d6ff'Ta5d6ffre hosting public
Ta5d6ff# entrypoints or gateways. The list source below provides a
Ta5d6ff# functional example, but better, more timely maintained
Ta5d6ff# lists probably exist in the community.

Ta5d6ff# blackhole_sources = 521c87a83afb8f29e4455e77930b973b


Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 8:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Path logging
Ta5d6ff# 8: Extreme logging

Ta5d6ffloglevel = 4


Ta5d6ff# The interfaces section defines the physical and virtual
Ta5d6ff# interfaces Reticulum will use to communicate on. This
Ta5d6ff# section will contain examples for a variety of interface
Ta5d6ff# types. You can modify these or use them as a basis for
Ta5d6ff# your own config, or simply remove the unused ones.

Ta5d6ff[interfaces]

Ta5d6ff # This interface enables communication with other
Ta5d6ff # link-local Reticulum nodes over UDP. It does not
Ta5d6ff # need any functional IP infrastructure like routers
Ta5d6ff # or DHCP servers, but will require that at least link-
Ta5d6ff # local IPv6 is enabled in your operating system, which
Ta5d6ff # should be enabled by default in almost any OS. See
Ta5d6ff # the Reticulum Manual for more configuration options.

Ta5d6ff [[Default Interface]]
Ta5d6ff type = AutoInterface
Ta5d6ff enabled = Yes

Ta5d6ff'''Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────